package org.mbcorp.sar.controller;

import java.security.Principal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import org.mbcorp.sar.model.Solicitud;
import org.mbcorp.sar.service.AlertaService;
import org.mbcorp.sar.service.SolicitudService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.MessageSource;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@PreAuthorize(value = "isAuthenticated()")
@Controller
public class AprobarProgramacionController {

	@Autowired
    private MessageSource messageSource;

	@Autowired
	private SolicitudService solicitudService;
	
	@Autowired
	private AlertaService alertaService;
//	
//	@Autowired
//	private AreaService areaService;
//	
//	@Autowired
//	private ArchivoService archivoService;
//	
//	@Autowired
//	private TipoRequerimientoService tipoRequerimientoService;
//	
//	@Autowired
//	private SolicitudValidator solicitudValidator;
	
	@InitBinder
	public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
	    final String dateformat = this.messageSource.getMessage("date.format", null, locale);
	    final SimpleDateFormat sdf = new SimpleDateFormat(dateformat);
	    sdf.setLenient(false);
	    dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));
	}

	@RequestMapping(value = "/consultaAprobacionProgramacion", method = RequestMethod.GET)
	public String mostrarPendientes(Model model, Principal currentUser) {
		List<Solicitud> listaSolicitudes = solicitudService.buscarPendientesAprobacionProgramacion(currentUser);
		model.addAttribute("listaSolicitudes", listaSolicitudes);
		return "consultaAprobacionProgramacion";
	}

	@RequestMapping(value = "/aprobarProgramacion/{id}", method = RequestMethod.GET)
	public String mostrarDetalle(@PathVariable Integer id, Model model) {
		Solicitud s = solicitudService.armarSolicitud(id);
		if(!(s.getHorasRestantesAprobacion() >= 0)){
			model.addAttribute("flagPlazoTerminado", true);
		} else {
			model.addAttribute("flagPlazoTerminado", false);
		}
		model.addAttribute("solicitud", s);	
		return "aprobarProgramacion";
	   }
	
	@RequestMapping(value = "/aprobarProgramacion", method = RequestMethod.POST)
	public String aprobarProgramacion(Model model, boolean flagPlazoTerminado, Solicitud solicitud, Principal currentUser) {
		Solicitud s = solicitudService.armarSolicitud(solicitud.getId());
		if(flagPlazoTerminado){
			solicitudService.aprobarProgramacionFueraPlazo(s);
		} else {
			solicitudService.aprobarProgramacion(s);
		}		
		alertaService.mandarAlertaAprobacionProgramacion(s, flagPlazoTerminado);
		model.addAttribute("solicitud", s);	
		model.addAttribute("flagMsgAprobado", true);
		return mostrarPendientes(model, currentUser);
	   }
	
	@RequestMapping(value = "/rechazarProgramacion", method = RequestMethod.POST)
	public String rechazarProgramacion(Model model, Solicitud solicitud, Principal currentUser) {		
		Solicitud s = solicitudService.armarSolicitud(solicitud.getId());
		solicitudService.rechazarProgramacion(s);
		alertaService.mandarAlertaRechazoProgramacion(s);
		model.addAttribute("solicitud", s);	
		model.addAttribute("flagMsgRechazado", true);
		return mostrarPendientes(model, currentUser);
	   }
	
	@RequestMapping(value = "/observarProgramacion", method = RequestMethod.POST)
	public String observarProgramacion(Model model, Solicitud solicitud, Principal currentUser) {
		System.out.println("comentarios: " + solicitud.getComentariosReprogramacion());
		Solicitud s = solicitudService.armarSolicitud(solicitud.getId());
		s.setComentariosReprogramacion(solicitud.getComentariosReprogramacion());
		solicitudService.devolverProgramacion(s);	
		alertaService.mandarAlertaObservacionProgramacion(s);
		model.addAttribute("solicitud", s);	
		model.addAttribute("flagMsgObservado", true);
		return mostrarPendientes(model, currentUser);
	   }
}
